package com.dingding.manager.modules.system.dao.impl;


import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.dingding.manager.common.beans.sys.SysRole;
import com.dingding.manager.common.beans.sys.SysRoleMenu;
import com.dingding.manager.common.dao.Db;
import com.dingding.manager.common.dao.Page;
import com.dingding.manager.core.util.ToolUtil;
import com.dingding.manager.modules.system.dao.RoleDao;
import com.dingding.manager.modules.system.dto.role.ReqRoleListDTO;
import com.dingding.manager.modules.system.dto.role.ResRoleDTO;
import com.dingding.manager.modules.system.sql.RoleSQL;

/**
 * 
* @ClassName: RoleDaoImpl 
* @Description: 角色管理dao实现类
* @author SUNZHICHENG 
* @date 2016年12月1日 下午1:52:59 
* @version V2.6.2
 */
@Component("roleDao")
public class RoleDaoImpl implements RoleDao{
	
	private static Logger log=Logger.getLogger(RoleDaoImpl.class);
	
	/**
	 * @Description: 根据角色id查询角色信息        
	 * @date 2016年12月1日 下午2:40:57
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public ResRoleDTO getRoleById(Integer roleId) {		
		return Db.querySqlFirst(ResRoleDTO.class, RoleSQL.ROLE_INFO, roleId);
	}
	
	/**
	 * @Description: 根据用户名查询角色信息
	 * @param name   用户名    
	 * @date 2016年12月2日 下午10:44:29
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	
	@Override
	public List<SysRole> getRoleByName(String name) {
		return  Db.querySqlList(SysRole.class, RoleSQL.QUERY_ROLE_BY_USERNAME, name);
		
	}
	
	
	/**
	 * 
	 * @Description: 查询所有角色列表        
	 * @date 2016年12月5日 下午1:56:23
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	public List<SysRole> getRoleList(){
		return Db.querySqlList(SysRole.class, RoleSQL.QUERY_ROLELIST);
	}
	
	
	/**
	 * @Description: 删除角色
	 * @param roleId  角色id      
	 * @date 2016年12月1日 下午2:54:03
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean deleteRole(Integer roleId) {
		SysRole role = Db.findById(roleId, SysRole.class);
		if (role!=null) {
			// 0 未删除 1  已删除
			role.setDelFlag(1);
			Db.saveOrUpdate(role);
			return true;
		}
		return false;
	}
	
	/**
	 * @Description: 修改角色是否可用状态        
	 * @date 2016年12月1日 下午2:49:25
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean modifyRoleState(Integer roleId, Integer state) {
		SysRole role = Db.findById(roleId, SysRole.class);
		if (role!=null) {
			role.setRoleStatus(state);
			Db.saveOrUpdate(role);
			return true;
		}	
		return false;
	}
	
	
	/**
	 * @Description: 查询角色列表（或按条件）   
	 * @date 2016年12月6日 下午4:23:21
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public Page<ResRoleDTO> getRoleList(ReqRoleListDTO reqRoleListDTO,Integer start, Integer length) {
		
		StringBuffer sql=new StringBuffer("  select a.sysRoleId sysRoleId, a.roleName roleName,a.roleEnName roleEnName, "
				+ " a.roleType roleType,a.roleStatus roleStatus,a.dataScope dataScope,a.createUserId createUserId, "
				+ " DATE_FORMAT(a.createTime,'%Y-%m-%d %H:%I:%S') createTime,a.updateUserId updateUserId, "
				+ " DATE_FORMAT(a.updateTime,'%Y-%m-%d %H:%I:%S') updateTime,a.remarks remarks FROM dd_sys_role a  WHERE a.delFlag = 0  ");
		
		//参数集合
		List<Object> params=new ArrayList<Object>();
		if (reqRoleListDTO!=null) {
			//角色名
			if (ToolUtil.isNotEmpty(reqRoleListDTO.getRoleName())) {
				sql.append(" AND (a.roleName LIKE  ? OR a.roleEnName LIKE ? )  ");
				params.add("%"+reqRoleListDTO.getRoleName()+"%");
				params.add("%"+reqRoleListDTO.getRoleName()+"%");
			}
		}
		sql.append("  ORDER BY a.createTime desc  ");
		Integer row =(int) Math.ceil((double)(start+1)/length);
		Page<ResRoleDTO> page=new Page<>(row, length);
		return Db.querySqlByPage(ResRoleDTO.class, page, sql.toString(), params.toArray());
	}
	
	/**
	 * @Description: 添加角色/修改
	 * @date 2016年12月7日 下午10:15:02
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean addRole(SysRole role) {
		Db.saveOrUpdate(role);
		return true;
	}
	
	
	/**
	 * @Description:根据角色名获取角色 
	 * @date 2016年12月9日 上午9:45:36
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public List<SysRole> getRolesByName(String roleEnName,String roleName) {
		return Db.querySqlList(SysRole.class, RoleSQL.QUERY_ROLES_BY_ROLENAME, roleEnName,roleName);
	}
	
	/**
	 * @Description: 根据角色id查询角色菜单关联数据
	 * @date 2016年12月9日 上午10:51:13
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public List<SysRoleMenu> getRoleMenu(Integer sysRoleId) {		
		return Db.querySqlList(SysRoleMenu.class, RoleSQL.QUERY_ROLEMENU_BY_ROLEID, sysRoleId);
	}
	
	/**
	 * @Description: 根据角色id删除角色菜单关联
	 * @date 2016年12月9日 上午11:10:44
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public void deleteRoleMenu(Integer sysRoleId) {
		List<SysRoleMenu> roleMenu = getRoleMenu(sysRoleId);
		for (SysRoleMenu sysRoleMenu : roleMenu) {
			Db.delete(sysRoleMenu);
		}
		
	}
	
	/**
	 * @Description: 添加  角色菜单关联      
	 * @date 2016年12月9日 上午11:23:27
	 * @author SUNZH2.6.2
	 */
	@Override
	public void addRoleMenu(SysRoleMenu sysRoleMenu) {
		Db.saveOrUpdate(sysRoleMenu);
	}
	
	
	
	
	
}
